home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 55724 / 55724.xpi / chrome / linkTargetDisplay.js < prev    next >
Text File  |  2010-01-17  |  3KB  |  113 lines

  1. window.addEventListener("load", function () {
  2.   var overLink = "";
  3.   XULBrowserWindow.__defineGetter__("overLink", function () overLink);
  4.   XULBrowserWindow.__defineSetter__("overLink", function (val) {
  5.     overLink = val;
  6.     if (!isElementVisible(this.statusTextField))
  7.       LinkTargetDisplay.update();
  8.     return val;
  9.   });
  10. }, false);
  11.  
  12. var LinkTargetDisplay = {
  13.   get _35 () {
  14.     delete this._35;
  15.     return this._35 = (navigator.userAgent.indexOf("rv:1.9.1") > -1);
  16.   },
  17.  
  18.   DELAY_SHOW: 50,
  19.   DELAY_HIDE: 150,
  20.  
  21.   get popup () {
  22.     delete this.popup;
  23.     return this.popup = document.getElementById("linkTargetDisplay");
  24.   },
  25.  
  26.   get label () {
  27.     delete this.label;
  28.     return this.label = this.popup.firstChild;
  29.   },
  30.  
  31.   get isOpen () this.popup.state == "open" || this.popup.state == "showing",
  32.  
  33.   update: function () {
  34.     if (this._timer) {
  35.       clearTimeout(this._timer);
  36.       this._timer = 0;
  37.     }
  38.  
  39.     if (!XULBrowserWindow.overLink) {
  40.       window.removeEventListener("mousemove", this, true);
  41.       this._timer = setTimeout(function (self) {
  42.         self._timer = 0;
  43.         self.popup.hidePopup();
  44.         self._mouseX = 0;
  45.         self._mouseY = 0;
  46.       }, this.DELAY_HIDE, this);
  47.       return;
  48.     }
  49.  
  50.     window.addEventListener("mousemove", this, true);
  51.  
  52.     if (this.isOpen) {
  53.       this.label.value = XULBrowserWindow.overLink;
  54.       return;
  55.     }
  56.  
  57.     this._show();
  58.   },
  59.  
  60.   handleEvent: function (event) {
  61.     switch (event.type) {
  62.       case "mousemove":
  63.         this._mouseX = event.screenX;
  64.         this._mouseY = event.screenY;
  65.         if (this.isOpen)
  66.           this._adjustPosition();
  67.         else
  68.           this._show();
  69.         break;
  70.     }
  71.   },
  72.  
  73.   _show: function () {
  74.     if (this._timer)
  75.       clearTimeout(this._timer);
  76.  
  77.     this._timer = setTimeout(function (self) {
  78.       self._timer = 0;
  79.  
  80.       self.label.value = XULBrowserWindow.overLink;
  81.  
  82.       var b = gBrowser.boxObject;
  83.       self.popup.width = b.width / 3;
  84.       self._rtl = (getComputedStyle(gBrowser, "").direction == "rtl");
  85.       self._leftEdge = b.screenX;
  86.       self._rightEdge = b.screenX + b.width;
  87.       self._bottomEdge = b.screenY + b.height;
  88.       self._adjustPosition();
  89.  
  90.       self.popup.openPopup(gBrowser, "end_after", 0, self._35 ? -3 : 0, false, false);
  91.     }, this.DELAY_SHOW, this);
  92.   },
  93.  
  94.   _adjustPosition: function () {
  95.     const PADDING = 30;
  96.     const HEIGHT = 24; // rough approximation
  97.     const WIDTH = parseInt(this.popup.width);
  98.     var mouseNearDefaultPos =
  99.           this._mouseY > this._bottomEdge - (HEIGHT + PADDING) &&
  100.           (this._rtl
  101.            ? this._mouseX > this._rightEdge - (WIDTH + PADDING) &&
  102.              this._mouseX < this._rightEdge
  103.            : this._mouseX > this._leftEdge &&
  104.              this._mouseX < this._leftEdge + WIDTH + PADDING);
  105.     if (mouseNearDefaultPos)
  106.       this.popup.style.MozMarginStart = (this._leftEdge - this._rightEdge) / 3 - (this._35 ? 3 : 0) + "px";
  107.     else
  108.       this.popup.style.MozMarginStart = (this._leftEdge - this._rightEdge) + "px";
  109.     this.popup.setAttribute("where", (mouseNearDefaultPos == !this._rtl) ?
  110.                                       "right" : "left");
  111.   }
  112. };
  113.